/*******************************************************************************
 * request >>>
 * 
 * [GET] model="object"
 *       model : 可选,为目标Model的别名/类名(取决于ClassLoader)
 * 
 * [POST] LOTEX_JSON_ARGS = [
 *            "name" : "datasource",
 *            "value" : {
 *                "id":"12"
 *            }
 *        ]
 * LOTEX_JSON_ARGS (@see BaseJsonAction) :
 *     String modelName;
 *     Map modelValue(以此在数据库中查找该model)；
 *          
 * 备注：目前为简化配置，必须指定id，且数据表 必须有id列。
 * 
 * response <<<
 * [JSON] {
 *     done : true/false,
 *     [message: ""]
 * }
 * 说明 :
 *     done: 可选，动作执行成功为true，反之为false;
 *     message：可选，返回服务器消息，例如错误消息。
 ******************************************************************************/
package sto.orz.json.webapp.action;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Iterator;

import ognl.Ognl;
import ognl.OgnlException;

import org.apache.commons.lang.StringUtils;
import sto.orz.json.JSONResponse;
import sto.orz.json.JsonArgsTest;
import sto.orz.rptp.model.Dataset;

/*******************************************************************************
 * <pre>
 *   调用方法:
 *   lot
 *   
 *    request &gt;&gt;&gt;
 *    
 *    [GET] model=&quot;object&quot;
 *          model : 可选,为目标Model的别名/类名(取决于ClassLoader)
 *    
 *    [POST] LOTEX_JSON_ARGS = [
 *               &quot;name&quot; : &quot;datasource&quot;,
 *               &quot;value&quot; : {
 *                   &quot;id&quot;:&quot;12&quot;
 *               }
 *           ]
 *    LOTEX_JSON_ARGS (@see BaseJsonAction) :
 *        String modelName;
 *        Map modelValue(以此在数据库中查找该model)；
 *             
 *    备注：目前为简化配置，必须指定id，且数据表 必须有id列。
 *    
 *    response &lt;&lt;&lt;
 *    [JSON] {
 *        done : true/false,
 *        [message: &quot;&quot;]
 *    }
 *    说明 :
 *        done: 可选，动作执行成功为true，反之为false;
 *        message：可选，返回服务器消息，例如错误消息。
 * </pre>
 * 
 * @author lot
 * <pre>
 * javascript 调用说明:
 * 调用方式一:直接写入调用参数.
 *     lotex.api.save("strArg", 2, [1,2]);
 * 调用方式二:调用参数用对象包装,这种可以实现自定义onLoad等行为.
 *     lotex.api.save({
 *         args:["strArg", 2, [1,2]]
 *         load: function(response){}
 *     });
 * </pre>
 */
/*******************************************************************************
 * apiArgs:
 *     args: 远程调用参数数组;
 *     url: 远程服务url;
 *     load: 调用成功回调函数;
 *     error: 无法调用回调函数;
 *     
 ******************************************************************************/
public class SaveModelAction extends BaseJSONAction {
	private static final long	serialVersionUID	= -7399485791317520861L;

	public String todo(String modelName, HashMap<String, String> model) {
		Class<?> modelClass;
		try {
			modelClass = loadModel(modelName);
		} catch (Exception e) {
			return message("Request domain model not found!");
		}

		Object object;
		String modelId = model.get("id");
		if (StringUtils.isBlank(modelId)) {
			try {
				object = modelClass.newInstance();
			} catch (InstantiationException e) {
				return message(e.getLocalizedMessage());
			} catch (IllegalAccessException e) {
				return message(e.getLocalizedMessage());
			}
		} else {
			// read model from database by id
			object = dao.findUniqueBy(modelClass, "id", modelId);
			if (object == null)
				return message("Model not exist!");
		}

		Iterator<String> it = model.keySet().iterator();

		// set value in model use jsonObject from jsonContent.value
		while (it.hasNext()) {
			String property = it.next();
			if (property.equalsIgnoreCase("id"))
				continue;
			try {
				Ognl.setValue(property, object, model.get(property));
			} catch (OgnlException e) {
				return message("Model property [" + property + "] not exist!");
			}
		}

		dao.save(object);
		dao.flush();

		JSONResponse response = new JSONResponse(true);
		try {
			response.add("id", Ognl.getValue("id", object));
		} catch (OgnlException e) {
			return message(e.getLocalizedMessage());
		}
		json = response;
		return JSON_RESPONSE;
	}
}
